package demo7;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * Spring管理一个对象时，会在特定的生命周期过程中回调当前类中的方法，使得当前类实例做对应操作
 * 例如：
 * 当Spring容器创建当前类的一个实例后，可以回调当前类的方法告知这一行为
 * 又或者对象即将被销毁时回调
 */
@Component
public class Person {
    private String name;

    public Person() {
        //1.构造器实际上是一个对生命周期第一个被调用的函数
        System.out.println("1.Person对象的构造器被调用了");
    }
    public String getName() {
        return name;
    }
    //通过@Value注解在Spring创建该对象时，利用属性为对应的set方法为属性值初始化
    @Value("张三")
    public void setName(String name) {
        this.name = name;
        System.out.println("2.name属性的set方法：setName()被调用了");
    }

    /*
    @PostConstruct注解是Spring容器在创建并初始化当前对象后,进行回调被该注解标注的方法
    因此,如果当前对象需要感知何时被Spring容器初始化完毕
    则可以任意定义一个方法然后使用该注解即可.
     */
    @PostConstruct
    public void init(){
        System.out.println("3.Spring容器初始化Person对象了，调用了@PostConstruct标注的方法");
    }
    /*
    当Spring容器被关闭时,容器会释放所有被管理的对象,此时如果该对象定义了一个方法并使用@PreDestory注解,
    那么Spring这时会调用该方法通知该对象它即将被容器销毁
     */
    @PreDestroy
    public void destroy(){
        System.out.println("4.Spring容器要将当前Person对象销毁了，调用了@PreDestroy标注的方法");
    }

}
